// https://leetcode.cn/problems/find-peak-element/
// Created by ade on 2022/8/23.
// 峰值元素是指其值严格大于左右相邻值的元素。
//
//给你一个整数数组 nums，找到峰值元素并返回其索引。数组可能包含多个峰值，在这种情况下，返回 任何一个峰值 所在位置即可。
//你可以假设 nums[-1] = nums[n] = -∞ 。
//你必须实现时间复杂度为 O(log n) 的算法来解决此问题。 [1,2,1,3,5,6,4] 结果是1或者5
#include <iostream>
#include <vector>


using namespace std;

class Solution {
public:
    // 可以理解成找最大值
    int findPeakElement(vector<int> &nums) {
        int left = 0, right = nums.size() - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < nums[mid + 1]) { // 这里是关键
                // 说明峰值在右侧
                left = mid + 1;
            } else {
                // 说明峰值在左侧
                right = mid;
            }
        }
        return left;
    }

};

int main() {
    Solution so;
    vector<int> nums = {1, 2, 3, 1};
    cout << so.findPeakElement(nums) << endl;
    return 0;
}